package com.jfire.socket.socketserver.handler.impl;

import java.nio.charset.Charset;
import javax.annotation.Resource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.jfire.baseutil.collection.ByteCache;
import com.jfire.baseutil.encrypt.RSAUtil;
import com.jfire.socket.socketserver.bus.BusinessCommand;
import com.jfire.socket.socketserver.bus.Message;
import com.jfire.socket.socketserver.handler.MessageHandler;

@Resource
public class AuthHandler implements MessageHandler
{
    private Charset charset = Charset.forName("utf8");
    private byte[]  privateKey;
    private Logger  logger  = LogManager.getLogger();
    
    @Override
    public byte interestedDataPacketType()
    {
        return BusinessCommand.AUTH;
    }
    
    @Override
    public void handler(Message message)
    {
        logger.trace("收到验证消息,开始进行验证");
        ByteCache data = message.getBusinessData();
        RSAUtil rsaUtil = new RSAUtil();
        rsaUtil.setPrivateKey(privateKey);
        // 在正确的情况下，客户端应该发送jfire+当前时间毫秒数的字符串
        byte[] authMsgBytes = rsaUtil.decrypt(data.toArray());
        String authMsg = new String(authMsgBytes, charset);
        long clientTime = Long.valueOf(authMsg.substring(5));
        long result = System.currentTimeMillis() - clientTime;
        if (result >= -220000 && result <= 220000)
        {
            data.clear().putArray(rsaUtil.sign(authMsgBytes));
            logger.debug("客户端{}验证成功", message.getChannelInfo().getAddress());
        }
        else
        {
            message.getChannelInfo().close();
            logger.debug("客户端{}验证失败", message.getChannelInfo().getAddress());
        }
    }
    
    public void setPrivateKey(byte[] privateKey)
    {
        this.privateKey = privateKey;
        RSAUtil rsaUtil = new RSAUtil();
        rsaUtil.setPrivateKey(privateKey);
    }
}
